#include "Thread.h"
#include <stdio.h>
#include <iostream>
#include "../../include/Logger.h"

using std::cout;
using std::endl;

__thread const char *name;

Thread::Thread(const ThreadCallback &cb)
: _thid(0)
, _isRunning(false)
, _cb(cb)
{

}

Thread::Thread(ThreadCallback &&cb)
: _thid(0)
, _isRunning(false)
, _cb(std::move(cb))//注册回调函数
{

}

Thread::Thread(ThreadCallback &&cb,const string & name)
: _thid(0)
, _isRunning(false)
, _cb(std::move(cb))
,_name(name)
{

}

Thread::~Thread()
{

}

//线程的运行与停止
void Thread::start()
{
    //自己的函数想跳转的话，可以使用ctags
    //shift + k,可以跳转到库函数的定义
    //threadFunc需要设计为静态函数，不然与pthread_create的第三个
    //参数不匹配
    int ret = pthread_create(&_thid, nullptr, threadFunc, this);
    if(ret)
    {
        //perror("pthread_create");
        LogError("pthread_create");
        return;
    }

    _isRunning = true;
}

void Thread::stop()
{
    if(_isRunning)
    {
        int ret = pthread_join(_thid, nullptr);
        if(ret)
        {
            //perror("pthread_join");
            LogError("pthread_join");
            return;
        }

        _isRunning = false;
    }
}

//线程入口函数
void *Thread::threadFunc(void *arg)
{
    Thread *pth = static_cast<Thread *>(arg);
    // 给线程局部变量赋值
    name = pth->_name.c_str(); 
    if(pth)
    {
        pth->_cb();//回调函数的执行
    }
    else
    {
        //cout << "pth == nullptr" << endl;
        LogInfo("pth == nullptr");
    }

    /* return nullptr; */
    pthread_exit(nullptr);
}
